]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
messageTray: Skip banner mode when queue exceeds a threshold
authorFlorian Müllner <fmuellner@gnome.org>
Sat, 14 Feb 2015 02:18:52 +0000 (03:18 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 20 Feb 2015 16:40:48 +0000 (17:40 +0100)
We want to shield users from being overloaded by an overwhelming stream
of notification banners, either due to coming back from idle/lock or
because an application is misbehaving. Previously we replaced all queued
notifications with a summary notification in that case, but now that
notifications appear in the summary immediately, we can simply stop
adding them to the queue and rely on the date menu to convey that
information to the user.

https://bugzilla.gnome.org/show_bug.cgi?id=744850

js/ui/messageTray.js

index eea354cf7282d6fcda4f9b5de89c60698dea9a36..7dfa6c0f224e23722e787b21ca667be814e0d455 100644 (file)
@@ -27,6 +27,8 @@ const NOTIFICATION_TIMEOUT = 4;
 const HIDE_TIMEOUT = 0.2;
 const LONGER_HIDE_TIMEOUT = 0.6;
 
+const MAX_NOTIFICATIONS_IN_QUEUE = 3;
+
 // We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD
 // range from the point where it left the tray.
 const MOUSE_LEFT_ACTOR_THRESHOLD = 20;
@@ -1550,12 +1552,19 @@ const MessageTray = new Lang.Class({
             // we stop hiding it and show it again.
             this._updateShowingNotification();
         } else if (this._notificationQueue.indexOf(notification) < 0) {
-            notification.connect('destroy',
-                                 Lang.bind(this, this._onNotificationDestroy));
-            this._notificationQueue.push(notification);
-            this._notificationQueue.sort(function(notification1, notification2) {
-                return (notification2.urgency - notification1.urgency);
-            });
+            // If the queue is "full", we skip banner mode and just show a small
+            // indicator in the panel; however do make an exception for CRITICAL
+            // notifications, as only banner mode allows expansion.
+            let bannerCount = this._notification ? 1 : 0;
+            let full = (this.queueCount + bannerCount >= MAX_NOTIFICATIONS_IN_QUEUE);
+            if (!full || notification.urgency == Urgency.CRITICAL) {
+                notification.connect('destroy',
+                                     Lang.bind(this, this._onNotificationDestroy));
+                this._notificationQueue.push(notification);
+                this._notificationQueue.sort(function(notification1, notification2) {
+                    return (notification2.urgency - notification1.urgency);
+                });
+            }
         }
         this._updateState();
     },